package pe.intix.drawback.model;

import javax.persistence.*;
import javax.validation.constraints.*;

import org.openxava.annotations.*;
import org.openxava.calculators.*;

/**
 * @author Jeromy Altuna
 * @author Renato
 */
@Entity
@Table(name = "detalle_comprobante_pago")
@Views([
	@View(name = "Simple", members = """
			producto; 
			cantidad, precioUnitario, costo;"""
		),
	@View(name = "ConDatosComprobante", members = """
			id; 
			Factura [
				comprobantePago
			]; 
			Producto [
				producto, disponible
			]"""
	)
])
@Tab(properties = """comprobantePago.serie, comprobantePago.numero, 
		comprobantePago.fecha, producto.descripcion, disponible""")
class DetalleComprobantePago {

	@Hidden
	@Id	@GeneratedValue(strategy = GenerationType.AUTO)
	@Column(name = "item")
	Long id

	@Required @DefaultValueCalculator(ZeroBigDecimalCalculator)
	@Digits(integer = 18, fraction = 6) 
	@Column(name = "cantidad", precision = 18, scale = 6)
	BigDecimal cantidad

	@Required @DefaultValueCalculator(ZeroBigDecimalCalculator)
	@Digits(integer = 18, fraction = 6) 
	@Column(name = "precio_unitario", precision = 18, scale = 6)
	BigDecimal precioUnitario

	//@Digits(integer = 18, fraction = 6)
	@Column(name = "sub_total", precision = 18, scale = 6)
	BigDecimal subTotal

	@Hidden
	@Column(name = "id_nisira", length = 15)
	String idNisira

	@Hidden
	@Column(name = "id_nisira_item", length = 3)
	String idNisiraItem

	@Stereotype("MEMO")
	@Column(name = "descripcion_adicional")
	String descripcionAdicional

	@Column(name = "declarado_en_dua", precision = 18, scale = 6)
	BigDecimal declaradoEnDua = new BigDecimal("0.0")

	@NoFrame
	@ReferenceViews([
		@ReferenceView("Simple"),
		@ReferenceView(forViews = "ConDatosComprobante", value = "MuySimple")
	])
	@JoinColumn(name = "id_producto", referencedColumnName = "id_producto")
	@ManyToOne
	Producto producto

	@NoFrame
	@ReferenceView(forViews = "ConDatosComprobante", value="SerieNumeroFecha")
	@JoinColumn(name = "id_comprobante", referencedColumnName = "id_comprobante")
	@ManyToOne
	ComprobantePago comprobantePago

	//@Digits(integer = 18, fraction = 6)
	@Depends("precioUnitario, cantidad")
	BigDecimal getCosto(){
		return cantidad*precioUnitario
	}

	@PrePersist @PreUpdate
	private void setSubTotal(){
		subTotal = getCosto()
	}
	
	//@Digits(integer = 18, fraction = 6)	
	@Depends("cantidad, declaradoEnDua")
	BigDecimal getDisponible(){
		return cantidad - declaradoEnDua
	}
	
	void actualizarDeclaradoEnDua(BigDecimal unidades){
		declaradoEnDua += unidades
	}	
//	@OneToMany(mappedBy = "detalleComprobantePago")
//	Collection<DetalleDeclaracionJurada> detalleDeclaracionJurada
}
